package com.lmf.ssm.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lmf.ssm.bean.Employee;
import com.lmf.ssm.bean.Msg;
import com.lmf.ssm.services.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Controller
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 一：即可以根据id删除员工
     * 二·也可以进行批量删除
     */
    @ResponseBody
    @RequestMapping(value = "/emps/{ids}",method = RequestMethod.DELETE)
    public Msg deleteEmp(@PathVariable("ids") String ids){
        if (ids.contains("-")) {
            //批量删除员工

            //将 1-2-3-4...等这样的字符串，将-作为分隔符，数字封装为一个字符数组
            String[] split = ids.split("-");
            //将字符数组，循环遍历添加进一个整形list集合中，即实现了数组与list集合的转换
            List<Integer> list = new ArrayList();
            for (String s : split) {
                list.add(Integer.parseInt(s));
            }
            employeeService.deleteBatch(list);
            return Msg.success().add("del_all","批量删除成功！");
        }else {
            //根据id，单个删除员工
            employeeService.deleteEmpById(Integer.parseInt(ids));
            return Msg.success();
        }

    }
    /**
     * 为什么ajax不能直接发送put请求？
     * 原因如下：
     * （1）tomcat服务器：只会将post请求中的数据，封装为一个map集合；
     * （2）SpringMVC框架：会自动将tomcat封装的map集合，封装为一个实例对象或者单个变量数据
     * （3）因此当Ajax请求发送put请求时，tomcat不会将put请求数据封装为一个map集合，springMVC框架自然也获取不到数据。
     * 解决方案：
     *  方案一：去修改tomcat底层源码
     *  方案二：在web.xml配置文件中，注册一个HttpPutFormContentFilter过滤器
     *
     * 注意：resultful风格，路径中的变量需要与映射方法的封装对象属性名一致，不然就获取不到数据；
     *      （除非是单个变量获取数据，可用使用 @PathVariable("路径变量名")注解来获取数据）
     * @param employee
     * @return
     */
    //保存修改的员工数据
    @RequestMapping(value = "/emps/{empId}",method = RequestMethod.PUT)
    @ResponseBody
    public Msg saveEmp( Employee employee){
        System.out.println("接收的对象数据："+employee);
        employeeService.updateEmp(employee);
        return Msg.success();
    }

    //查询被修改员工的数据
    @RequestMapping(value = "/emps/{id}",method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmpNames(@PathVariable("id") Integer id){
        Employee employee = employeeService.getEmp(id);
        return Msg.success().add("emp",employee);
    }

    //验证用户是否可用,true:表示用户名可用，false：表示用户名不可用
    @RequestMapping(value = "/checkuser",method = RequestMethod.POST)
    @ResponseBody
    public Msg checkusers(@RequestParam("empName") String empName){
        //后端验证表单数据格式方法（后端验证比前端更严格，同一标准情况下）：
        //1.先创建一个正则表达式的格式
        String regx = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]{2,5})";
        //2.直接调用String类的matches匹配方法进行匹配就ok
        boolean matches = empName.matches(regx);
        if (!matches) {
            return Msg.fail().add("va_regx","用户名可以是2-5位中文或者6-16位英文和数字组合");
        }
        //验证用户名是否已存在
        Boolean b=employeeService.checkusers(empName);
        if (b){
            return Msg.success();
        }else {
            return Msg.fail().add("va_regx","用户名已存在");
        }
    }

    //处理请求，并返回一个页面
    @RequestMapping(value = "/emps_list")
    public String getEmps(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model){
        //1.分页插件必须放在查询前面
        PageHelper.startPage(pn,5);
        //2.查询语句必须紧跟在分页插件后面，中间若穿插其他代码，会出现bug
        List<Employee> employeeList = employeeService.getAll();
        //3.使用PageInfo对查询数据进行封装
        PageInfo<Employee> pageInfo = new PageInfo<>(employeeList,5);//配置导航显示页面数
        //4.然后将PageInfo交给页面展示就ok了
        model.addAttribute("pageInfo",pageInfo);
        return "list";
    }

    //查询员工信息
    //运用ajax的请求方式，直接返回一个对象，会被转换为json数据格式（需要添加jackson解析依赖），方便各种设备（电脑，手机等等）的进行数据填充
    @RequestMapping(value = "/emps",method = RequestMethod.GET)
    @ResponseBody
    public Msg getPage(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model){
        //1.分页插件必须放在查询前面
        PageHelper.startPage(pn,5);
        //2.查询语句必须紧跟在分页插件后面，中间若穿插其他代码，会出现bug
        List<Employee> employeeList = employeeService.getAll();
        //3.使用PageInfo对查询数据进行封装
        PageInfo<Employee> pageInfo = new PageInfo<>(employeeList,5);//配置导航显示页面数
        //4.直接返回一个信息封装类
        Msg msg = new Msg();
        return msg.success().add("pageInfo",pageInfo);
    }

}
